uniform sampler2D lines, depthTexture;
uniform vec2 screenSize;
uniform vec4 color;
uniform int threshold;
uniform int gaussian;
           
void main(void) { 
 
  float pixel;
  float depth;
  float minDepth= 1.0; 
  int foreground= 0;
  float alpha= 0.0;

  float centerDepth= texture2D(depthTexture, gl_FragCoord.xy/screenSize).r;

  int i;

  vec2 depthOffsets[16];  

  depthOffsets[0]=   vec2(-2.0, -2.0);	
  depthOffsets[1]=   vec2(-2.0, -1.0);
  depthOffsets[2]=   vec2(-2.0,  0.0);
  depthOffsets[3]=   vec2(-2.0,  1.0);	
  depthOffsets[4]=   vec2(-2.0,  2.0);	
  depthOffsets[5]=   vec2(-1.0, -2.0);
  depthOffsets[6]=   vec2(-1.0,  2.0);	
  depthOffsets[7]=  vec2( 0.0, -2.0);
  depthOffsets[8]=  vec2( 0.0,  2.0);
  depthOffsets[9]=  vec2( 1.0, -2.0);
  depthOffsets[10]=  vec2( 1.0,  2.0);	
  depthOffsets[11]=  vec2( 2.0, -2.0);	
  depthOffsets[12]=  vec2( 2.0, -1.0);
  depthOffsets[13]=  vec2( 2.0,  0.0);
  depthOffsets[14]=  vec2( 2.0,  1.0);
  depthOffsets[15]=  vec2( 2.0, -2.0);	


  vec2 gaussian3x3DepthOffsets[12]; 

  gaussian3x3DepthOffsets[0]=   vec2(-3.0, -1.0);
  gaussian3x3DepthOffsets[1]=   vec2(-3.0,  0.0);
  gaussian3x3DepthOffsets[2]=   vec2(-3.0,  1.0);
  gaussian3x3DepthOffsets[3]=   vec2(-1.0, -3.0);	
  gaussian3x3DepthOffsets[4]=   vec2(-1.0,  3.0);
  gaussian3x3DepthOffsets[5]=   vec2( 0.0, -3.0);
  gaussian3x3DepthOffsets[6]=   vec2( 0.0,  3.0);
  gaussian3x3DepthOffsets[7]=   vec2( 1.0, -3.0);
  gaussian3x3DepthOffsets[8]=   vec2( 1.0,  3.0);	
  gaussian3x3DepthOffsets[9]=   vec2( 3.0, -1.0);
  gaussian3x3DepthOffsets[10]=  vec2( 3.0,  0.0);
  gaussian3x3DepthOffsets[11]=  vec2( 3.0,  1.0);

  vec2 gaussian5x5DepthOffsets[24];  

  gaussian5x5DepthOffsets[0]=   vec2(-3.0, -3.0);
  gaussian5x5DepthOffsets[1]=   vec2(-3.0, -2.0);		
  gaussian5x5DepthOffsets[2]=   vec2(-3.0,  2.0);
  gaussian5x5DepthOffsets[3]=   vec2(-3.0,  3.0);
  gaussian5x5DepthOffsets[4]=   vec2(-2.0, -3.0);
  gaussian5x5DepthOffsets[5]=   vec2( 2.0,  3.0);
  gaussian5x5DepthOffsets[6]=  vec2( 2.0, -3.0);
  gaussian5x5DepthOffsets[7]=  vec2( 2.0,  3.0);	
  gaussian5x5DepthOffsets[8]=  vec2( 3.0, -3.0);
  gaussian5x5DepthOffsets[9]=  vec2( 3.0, -2.0);	
  gaussian5x5DepthOffsets[10]=  vec2( 3.0,  2.0);
  gaussian5x5DepthOffsets[11]=  vec2( 3.0,  3.0);


  vec2 offsets[9];
  
  offsets[0]=  vec2(-1.0, -1.0);
  offsets[1]=  vec2( 0.0, -1.0);
  offsets[2]=  vec2( 1.0, -1.0);
  offsets[3]=  vec2(-1.0,  0.0);
  offsets[4]=  vec2( 0.0,  0.0);
  offsets[5]=  vec2( 1.0,  0.0);
  offsets[6]=  vec2(-1.0,  1.0);
  offsets[7]=  vec2( 0.0,  1.0);
  offsets[8]=  vec2( 1.0,  1.0); 

  for(i=0; i<9; i++){
    pixel= texture2D(lines, (gl_FragCoord.xy+offsets[i])/screenSize).r;
    if(pixel>alpha) alpha= pixel;
    if(pixel!=0.0) foreground++; 
    if(centerDepth==1.0){ 
      depth= texture2D(depthTexture, (gl_FragCoord.xy+offsets[i])/screenSize).r;
      if(depth<minDepth) minDepth= depth;
    }
  }  
  
  if(foreground>=threshold){
    gl_FragColor= vec4(color.rgb, alpha);
    if(centerDepth==1.0){
      if(minDepth==1.0){
        float depth= 1.0;
	if(gaussian==0){
        for(i=0;i<16;i++){ 
            depth = texture2D(depthTexture, (gl_FragCoord.xy+depthOffsets[i])/screenSize).r; 
            if(depth<minDepth) minDepth= depth;
          }
        }
	else if(gaussian==3){
	  for(i=0;i<12;i++){ 
            depth = texture2D(depthTexture, (gl_FragCoord.xy+gaussian3x3DepthOffsets[i])/screenSize).r; 
            if(depth<minDepth) minDepth= depth;
          }
	}
	else{
	  for(i=0;i<12;i++){ 
            depth = texture2D(depthTexture, (gl_FragCoord.xy+gaussian5x5DepthOffsets[i])/screenSize).r; 
            if(depth<minDepth) minDepth= depth;
          }
	}
      }
      gl_FragDepth= minDepth;
    }
    else gl_FragDepth= gl_FragCoord.z;
  }   
  else{
    discard;
  }

  //gl_FragColor= texture2D(lines, gl_FragCoord.xy/screenSize);

}